package com.ly.common.message.service;

import com.aliyun.dysmsapi20170525.Client;
import com.alibaba.fastjson2.JSON;
import com.aliyun.dysmsapi20170525.models.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
@Slf4j
public class AliSmsService {

    @Autowired
    private Client aliClient;

    @Value("${sms.aliyun.templateCode:}")
    private String templateCode;

    @Value("${sms.send-message:true}")
    private boolean sendMessage;

    @Value("${sms.sing-name:}")
    private String signName;

    /**
     * 发送短信验证码
     */
    public boolean sendMobileCode(String phone, String code) {
        Map<String, String> params = new HashMap<>();
        params.put("code", code);
        return sendTempMessage(phone, templateCode, params);
    }

    /**
     * 发送模板消息
     */
    public boolean sendTempMessage(String phone, String templateCode, Map<String, String> params) {
        if (!sendMessage) {
            log.warn("短信发送通道关闭，phone={}", phone);
            return false;
        }

        SendSmsRequest request = new SendSmsRequest()
                .setPhoneNumbers(phone)
                .setSignName(signName)
                .setTemplateCode(templateCode)
                .setTemplateParam(JSON.toJSONString(params));

        try {
            SendSmsResponse response = aliClient.sendSms(request);
            SendSmsResponseBody body = response.getBody();

            if (!"OK".equalsIgnoreCase(body.getCode())) {
                log.error("短信发送失败, phone={}, 原因={}", phone, body.getMessage());
                return false;
            }
            return true;
        } catch (Exception e) {
            log.error("短信发送异常, phone={}, 原因={}", phone, e.getMessage(), e);
            return false;
        }
    }
}

//阿里云 SMS SDK 使用
//依赖 com.aliyun.dysmsapi20170525.Client 发送请求。
//需配置 signName（签名）和 templateCode（模板 ID）。

//Fastjson2 的作用
//将 Map 参数序列化为 JSON 字符串（TemplateParam 要求 JSON 格式）。

//开关控制
//通过 sendMessage 动态控制短信发送（测试环境可关闭）。

//日志记录
//记录发送失败的具体原因，方便排查问题。

//扩展性
//可结合 Spring 的 @Async 或消息队列实现异步发送，提升性能。